package com.github.alexvictoor.rule; import junit.framework.AssertionFailedError; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.Map; public class SocketRule implements TestRule { public static final Logger logger = LoggerFactory.getLogger(SocketRule.class); private Map<Integer, Exception> providedPorts = new HashMap<Integer, Exception>(); private int lastPort = 8000; public int findFreePort() { do { lastPort++; } while (!Sockets.isPortAvailable(lastPort)); providedPorts.put(lastPort, new Exception()); return lastPort; } public boolean checkProvidedPorts() { boolean result = true; for (Integer port : providedPorts.keySet()) { if (Sockets.isPortAvailable(port)) { logger.debug("Port {} is available", port); } else { logger.error("Port " + port + " has not been released properly, it has been used first at:", providedPorts.get(port)); } result = result && Sockets.isPortAvailable(port); } return result; } @Override public Statement apply(final Statement statement, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { statement.evaluate(); if (!checkProvidedPorts()) { throw new AssertionFailedError("All ports have not been released"); } } }; } }